package com.cskaoyan.javase.oop2.encapsulate._1extends._10final._2method;

/**
 * final修饰方法表示最后的方法，最终的方法，表示该方法无法被重写
 * （但是仍然可以被继承）。
 *
 * 语法：
 * [访问权限修饰符] final 返回值类型 方法名(形参列表){
 * //方法体
 * }
 *
 * 说明：
 *    final修饰成员方法，表示该方法无法被重写，但是仍然是可以继承的。
 *
 * 什么样的成员方法应该设置为final呢？
 *
 * 方法的设计已经比较完善，不需要子类进行修改了，子类只需要乖乖继承，使用父类的实现即可。
 * 比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 *
 * 即便是父类的方法不是很完善，但只要是希望子类不要改写方法都可以这么做。（要么你就用，不爽你就自己实现一个）
 * 日常开发，程序员还是比较少见有需要把方法设置成final修饰的。同样比较多见于JDK源码中
 * 比较常见的有：像Object类中的getClass()方法还有其中和线程相关的方法。
 *
 * 注意事项:
 * 在Java中父类中一些特殊方法，比如私有方法和静态方法，它们本身就不能被子类重写，加final毫无意义（但是也不会报错）
 * 而构造器是不能被继承的，也不能被重写，更不能加final
 *
 * @since 17:36
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        s.eat();
    }
}

class Person {

    // public final Person() {
    // }

    // 私有方法本身就不允许子类重写，再加一个final表示禁止重写,是没有意义的
    // 'private' method declared 'final'
    private final void test(){
    }

    // 'private' method declared 'final'
    public final static void testStatic(){

    }
    final void eat() {
        System.out.println("作为人,就要吃饭,吃饱了才有力气睡觉!");
    }
}


/*class LaoBa extends Person{
    eat()
}*/
class Student extends Person {
    // 'eat()' cannot override 'eat()' in 'com.cskaoyan.javase.oop2.encapsulate._1extends._10final._2method.Person'; overridden method is final
    /*@Override
    void eat() {
        System.out.println("我吃饭是为了学习!");
    }*/
}